/**
 * https://leetcode-cn.com/problems/single-number/
 * 只出现一次的数字
 * @param nums 
 */
const singleNumber = (nums: number[]): number => {
    let ans = 0

    // 对每一项进行按位或, 相同的项会消掉
    for (let num of nums) {
        ans ^= num
    }

    return ans
};


const singleNumber3 = (nums: number[]): number => {

    const len = nums.length;

    // map, 存储每个元素出现的情况
    const map: Record<number, number> = {}

    for (let i = 0; i < len; i++) {
        map[nums[i]] = (map[nums[i]] || 0) + 1
    }

    for (let prop in map) {
        if (map[prop] == 1) return +prop
    }

    return 0
};


const singleNumber2 = (nums: number[]): number => {
    // 进行排序
    nums.sort((a, b) => a - b)

    const len = nums.length;

    // 默认为第一个元素
    let v = nums[0]

    for (let i = 1; i < len; i++) {
        // 只要下一项不等于该项, 直接返回该元素
        if (nums[i] !== v) return v;

        // 更改v为下一项并且i跳过下一项
        v = nums[i + 1];
        i++
    }

    return v
};